package com.bigShen.pattern.proxy.dynamic;

import com.bigShen.pattern.proxy.LiLong;
import com.bigShen.pattern.proxy.Person;
import sun.misc.ProxyGenerator;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author: lei.shen
 * @date: 2018/10/2
 */
public class DynamicProxyTest {

    public static void main(String[] args) {

        LiLong liLong = new LiLong();
        Person person = (Person) new LoveAgentJDK(liLong).getInstance();
        System.out.println(person.getClass());
        person.findLove();

        // 动态代理原理 : 字节码重组
        // 1. 拿到被代理类对象的引用, 通过反射获取所有接口
        // 2. JDK Proxy 类重新生产一个新的类,同时新的类实现被代理类所有接口
        // 3. 动态生成Java代码,把新加的业务逻辑方法由一定的逻辑代码去调用
        // 4. 编译新生成的Java代码.class
        // 5. 重新加载到JVM中运行


        // class com.sun.proxy.$Proxy0
        // 从JVM中拿到代理类
//        byte[] bytes = ProxyGenerator.generateProxyClass("$Proxy0", new Class[]{Person.class});
//        FileOutputStream fos = null;
//        try {
//            fos = new FileOutputStream("E:\\$Proxy0.class");
//            fos.write(bytes);
//            fos.flush();
//
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        } finally {
//            System.out.println("E:\\$Proxy0.class 文件生产成功!");
//            try {
//                fos.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }

    }

}
